import axios, { AxiosResponse, AxiosError, InternalAxiosRequestConfig } from 'axios'
import { Message, Modal } from '@arco-design/web-vue'
import { useUserStore } from '@/store/modules/user'
import router from '@/router'

// 创建axios实例
const request = axios.create({
  baseURL: import.meta.env.VITE_API_BASE_URL || '/api',
  timeout: 10000,
  headers: {
    'Content-Type': 'application/json;charset=UTF-8'
  }
})

// 请求拦截器
request.interceptors.request.use(
  (config: InternalAxiosRequestConfig) => {
    const userStore = useUserStore()
    
    // 添加token
    if (userStore.token) {
      config.headers.Authorization = `Bearer ${userStore.token}`
    }
    
    return config
  },
  (error: AxiosError) => {
    return Promise.reject(error)
  }
)

// 响应拦截器
request.interceptors.response.use(
  (response: AxiosResponse) => {
    const { data } = response
    
    // 如果是文件下载，直接返回response
    if (response.headers['content-type']?.includes('application/octet-stream')) {
      return response
    }
    
    // 正常响应处理
    if (data.code === 200) {
      return data
    }
    
    // 业务错误处理
    Message.error(data.message || '请求失败')
    return Promise.reject(new Error(data.message || '请求失败'))
  },
  async (error: AxiosError) => {
    const { response } = error
    
    if (!response) {
      Message.error('网络连接异常')
      return Promise.reject(error)
    }
    
    const { status } = response
    
    switch (status) {
      case 401:
        // 未授权，但如果是logout请求失败，不需要再次调用logout避免循环
        if (error.config?.url?.includes('/logout')) {
          // logout请求失败，直接清除本地数据即可
          const userStore = useUserStore()
          userStore.clearToken()
          userStore.clearUserInfo()
          router.push('/login')
        } else {
          // 其他401错误，需要退出登录
          const userStore = useUserStore()
          await userStore.logout()
          
          Modal.warning({
            title: '登录已过期',
            content: '您的登录已过期，请重新登录',
            onOk: () => {
              router.push('/login')
            }
          })
        }
        break
        
      case 403:
        Message.error('权限不足')
        break
        
      case 404:
        Message.error('请求的资源不存在')
        break
        
      case 500:
        Message.error('服务器内部错误')
        break
        
      default:
        Message.error(response.data?.message || '请求失败')
    }
    
    return Promise.reject(error)
  }
)

export default request 